# LeetCode 290、单词规律
# 一、题目描述
给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", s = "dog cat cat dog" 输出: true
示例 2:
输入:pattern = "abba", s = "dog cat cat fish" 输出: false
示例 3:
输入: pattern = "aaaa", s = "dog cat cat dog" 输出: false
提示:
1 <= pattern.length <= 300
pattern
只包含小写英文字母1 <= s.length <= 3000
s
只包含小写英文字母和' '
s
不包含 任何前导或尾随对空格s
中每个单词都被 单个空格 分隔
# 二、题目解析
# 三、参考代码
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
s = s.split()
if len(pattern) != len(s):
return False
t = pattern
# 接下来的逻辑和 LC205. 同构字符串 一模一样
# 设置一个哈希集合用来存储字符串 s 当中的元素
dic1 = {}
# 设置一个哈希集合用来存储字符串 t 当中的元素
dic2 = {}
# 由于 t.length == s.length
# 按照顺序访问 s 和 t 中对应的元素
for i in range(len(pattern)):
# 1、访问的元素 s[i] 存在于 dic1 中
# 并且发现它对应的元素值和当前 t 中元素 t[i] 不相同
# 返回 False
if s[i] in dic1 and dic1[s[i]] != t[i]:
return False
# 2、访问的元素 t[i] 存在于 dic2 中
# 并且发现它对应的元素值和当前 s 中元素 s[i] 不相同
# 返回 False
if t[i] in dic2 and dic2[t[i]] != s[i]:
return False
# 3、访问的元素 s[i] 不存在于 dic1 中
# 存放到哈希集合中
if s[i] not in dic1:
# dic1[s[i]] = t[i]
dic1[s[i]] = t[i]
# 3、访问的元素 t[i] 不存在于 dic2 中
# 存放到哈希集合中
if t[i] not in dic2:
# dic2[t[i]] = s[i]
dic2[t[i]] = s[i]
# 返回 True
return True